﻿/*------------------------------------------------------------------------

TESTRD.HPP v1.0.1

Copyright 楊志賢 CxxlMan, 2013 - 2014
All Rights Reserved

------------------------------------------------------------------------*/

#if !defined(__TESTRD_HPP_Cxxl3D)
#define __TESTRD_HPP_Cxxl3D

#include <Sys\C3DNODE.HPP>
#include <Sys\RENDERUNIT.HPP>
#include <Sys\RenderUnit\SYSDDCLASSID.HPP>
#include <Sys\IREBDERPIPE.HPP>


namespace Cxxl3D
{

class ITestRD:public IRenderDatagram,public IC3D_NodeHost,public IRDpkg
{
  // 這裡須傳回 IRenderDatagram 的 "實作介面"，即被 cxxlCM_GetElement() 叫用的 InterfaceID
  CxxlMan::UNICODE_String cxxlFASTCALL GetRenderDatagramID() const
  {
    return ITest_ClassID;
  }

  // 傳回 IRenderDatagram 的 "實作介面"
  virtual void *cxxlFASTCALL GetDefaultInterface()
  {
    return this;
  }


protected:
  // 儲存容器藉此取得要永續存取的屬性資料
  // 延伸類別須以 virtual 的形式覆寫
  // 並且須呼叫上層類別的此函數
  virtual bool cxxlFASTCALL Ref(CxxlMan::Filter *F)
  {
    if(F != NULL && cxxlPreserve2::Ref(F))
      return true;
    else
      return false;
  }

  // Constructor
  ITestRD()
    :cxxlObject(CxxlMan::Spirit_Easy),
    CxxlMan::cxxlPreserve2(ITest_ClassID), // 在建構時指定 ClassID
    IRDpkg(this)
  {
  }
  // Destructor
  virtual ~ITestRD()
  {
  }

public:

  virtual void cxxlFASTCALL GetData(unsigned int *Count, Vector4 **ppVector4) const = 0; 

  // 取得 ITestRD 物件，失敗傳回 NULL
  static CxxlMan::Smart_Ptr<ITestRD> cxxlFASTCALL Create()
  {
    return CxxlMan::Preserve2_Cast<ITestRD>( CxxlMan::cxxlCM_GetElement(ITest_ClassID, IRenderDatagram_Group) );
  }

  friend class CxxlMan::IcxxlStorage;          // Preserve2 元件須加上這個
  friend class CxxlMan::Smart_Ptr<ITestRD>;  // Preserve2 元件須加上這個
};



} /* namespace Cxxl3D */
#endif
